package com.android.support.lib.universal.sdk.weibo;

import java.io.ByteArrayOutputStream;
import java.io.IOException;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.widget.Toast;

import com.android.support.lib.universal.R;
import com.android.support.lib.universal.sdk.weibo.general.AccessTokenKeeper;
import com.android.support.lib.universal.sdk.weibo.general.Constants;
import com.sina.weibo.sdk.api.ImageObject;
import com.sina.weibo.sdk.api.MusicObject;
import com.sina.weibo.sdk.api.TextObject;
import com.sina.weibo.sdk.api.VideoObject;
import com.sina.weibo.sdk.api.VoiceObject;
import com.sina.weibo.sdk.api.WebpageObject;
import com.sina.weibo.sdk.api.WeiboMessage;
import com.sina.weibo.sdk.api.WeiboMultiMessage;
import com.sina.weibo.sdk.api.share.BaseResponse;
import com.sina.weibo.sdk.api.share.IWeiboHandler;
import com.sina.weibo.sdk.api.share.IWeiboShareAPI;
import com.sina.weibo.sdk.api.share.SendMessageToWeiboRequest;
import com.sina.weibo.sdk.api.share.SendMultiMessageToWeiboRequest;
import com.sina.weibo.sdk.api.share.WeiboShareSDK;
import com.sina.weibo.sdk.auth.AuthInfo;
import com.sina.weibo.sdk.auth.Oauth2AccessToken;
import com.sina.weibo.sdk.auth.WeiboAuthListener;
import com.sina.weibo.sdk.constant.WBConstants;
import com.sina.weibo.sdk.exception.WeiboException;
import com.sina.weibo.sdk.utils.LogUtil;
import com.sina.weibo.sdk.utils.Utility;

/**
 * 
 * 分享Activity
 * 
 * @author 彭治铭
 *
 */

// 注册时必须添加：
// <intent-filter>
// <!-- 必不可少，用来接收微博回调,唤起onResponse()方法。否则无法回调。 -->
// <action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY" />
// <category android:name="android.intent.category.DEFAULT" />
// </intent-filter>

public class WBShareActivity extends Activity implements IWeiboHandler.Response {

	public static final int SHARE_CLIENT = 1;// 仅客户端分享
	public static final int SHARE_ALL_IN_ONE = 2;// 有客户端则选择客户端分享,无客户端则选择网页版分享

	private int mShareType = SHARE_ALL_IN_ONE;// 设置默认分享类型

	/** 微博微博分享接口实例 */
	private IWeiboShareAPI mWeiboShareAPI = null;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.lib_activity_sdk_weibo);

		// 创建微博分享接口实例
		mWeiboShareAPI = WeiboShareSDK.createWeiboAPI(this, Constants.APP_KEY);

		// 注册第三方应用到微博客户端中，注册成功后该应用将显示在微博的应用列表中。
		// 但该附件栏集成分享权限需要合作申请，详情请查看 Demo 提示
		// NOTE：请务必提前注册，即界面初始化的时候或是应用程序初始化时，进行注册
		mWeiboShareAPI.registerApp();

		// 当 Activity 被重新初始化时（该 Activity 处于后台时，可能会由于内存不足被杀掉了），
		// 需要调用 {@link IWeiboShareAPI#handleWeiboResponse} 来接收微博客户端返回的数据。
		// 执行成功，返回 true，并调用 {@link IWeiboHandler.Response#onResponse}；
		// 失败返回 false，不调用上述回调
		if (savedInstanceState != null) {
			mWeiboShareAPI.handleWeiboResponse(getIntent(), this);
		}

		Boolean hasText = true;// 是否文本分享
		Boolean hasImage = false;// 是否图片分享
		Boolean hasWebpage = false;// 是否网页分享
		Boolean hasMusic = false;// 是否音乐分享
		Boolean hasVideo = false;// 是否视频分享
		Boolean hasVoice = false;// 是否音频(声音)分享

		// 分享到微博，分享的资源修改下面的get()方法即可。
		sendMessage(hasText, hasImage, hasWebpage, hasMusic, hasVideo, hasVoice);

	}

	/**
	 * @see {@link Activity#onNewIntent}
	 */
	@Override
	protected void onNewIntent(Intent intent) {
		super.onNewIntent(intent);

		// 从当前应用唤起微博并进行分享后，返回到当前应用时，需要在此处调用该函数
		// 来接收微博客户端返回的数据；执行成功，返回 true，并调用
		// {@link IWeiboHandler.Response#onResponse}；失败返回 false，不调用上述回调
		mWeiboShareAPI.handleWeiboResponse(intent, this);
	}

	/**
	 * 接收微客户端博请求的数据。 当微博客户端唤起当前应用并进行分享时，该方法被调用。
	 * 
	 * @param baseResp
	 *            微博请求数据对象
	 * @see {@link IWeiboShareAPI#handleWeiboRequest}
	 */
	@Override
	public void onResponse(BaseResponse baseResp) {
		if (baseResp != null) {
			switch (baseResp.errCode) {
			case WBConstants.ErrorCode.ERR_OK:
				Toast.makeText(this,
						"分享成功",
						Toast.LENGTH_LONG).show();
				break;
			case WBConstants.ErrorCode.ERR_CANCEL:
				Toast.makeText(this,
						"取消分享",
						Toast.LENGTH_LONG).show();
				break;
			case WBConstants.ErrorCode.ERR_FAIL:
				Toast.makeText(
						this,
						"分享失败"
								+ "Error Message: " + baseResp.errMsg,
						Toast.LENGTH_LONG).show();
				break;
			}
		}
		// 结束掉当前分享Activity
		this.finish();
	}

	/**
	 * 第三方应用发送请求消息到微博，唤起微博分享界面。
	 * 
	 * @see {@link #sendMultiMessage} 或者 {@link #sendSingleMessage}
	 */
	private void sendMessage(boolean hasText, boolean hasImage,
			boolean hasWebpage, boolean hasMusic, boolean hasVideo,
			boolean hasVoice) {

		if (mShareType == SHARE_CLIENT) {
			if (mWeiboShareAPI.isWeiboAppSupportAPI()) {
				int supportApi = mWeiboShareAPI.getWeiboAppSupportAPI();
				if (supportApi >= 10351 /* ApiUtils.BUILD_INT_VER_2_2 */) {
					sendMultiMessage(hasText, hasImage, hasWebpage, hasMusic,
							hasVideo, hasVoice);
				} else {
					sendSingleMessage(hasText, hasImage, hasWebpage, hasMusic,
							hasVideo/* , hasVoice */);
				}
			} else {
				Toast.makeText(this,
						"微博客户端不支持 SDK 分享或微博客户端未安装或微博客户端是非官方版本。",
						Toast.LENGTH_SHORT).show();
			}
		} else if (mShareType == SHARE_ALL_IN_ONE) {
			sendMultiMessage(hasText, hasImage, hasWebpage, hasMusic, hasVideo,
					hasVoice);
		}
	}

	/**
	 * 第三方应用发送请求消息到微博，唤起微博分享界面。 注意：当
	 * {@link IWeiboShareAPI#getWeiboAppSupportAPI()} >= 10351 时，支持同时分享多条消息，
	 * 同时可以分享文本、图片以及其它媒体资源（网页、音乐、视频、声音中的一种）。
	 * 
	 * @param hasText
	 *            分享的内容是否有文本
	 * @param hasImage
	 *            分享的内容是否有图片
	 * @param hasWebpage
	 *            分享的内容是否有网页
	 * @param hasMusic
	 *            分享的内容是否有音乐
	 * @param hasVideo
	 *            分享的内容是否有视频
	 * @param hasVoice
	 *            分享的内容是否有声音
	 */
	private void sendMultiMessage(boolean hasText, boolean hasImage,
			boolean hasWebpage, boolean hasMusic, boolean hasVideo,
			boolean hasVoice) {

		// 1. 初始化微博的分享消息
		WeiboMultiMessage weiboMessage = new WeiboMultiMessage();
		if (hasText) {
			weiboMessage.textObject = getTextObj();
		}

		if (hasImage) {
			weiboMessage.imageObject = getImageObj();
		}

		// 用户可以分享其它媒体资源（网页、音乐、视频、声音中的一种）
		if (hasWebpage) {
			weiboMessage.mediaObject = getWebpageObj();
		}
		if (hasMusic) {
			weiboMessage.mediaObject = getMusicObj();
		}
		if (hasVideo) {
			weiboMessage.mediaObject = getVideoObj();
		}
		if (hasVoice) {
			weiboMessage.mediaObject = getVoiceObj();
		}

		// 2. 初始化从第三方到微博的消息请求
		SendMultiMessageToWeiboRequest request = new SendMultiMessageToWeiboRequest();
		// 用transaction唯一标识一个请求
		request.transaction = String.valueOf(System.currentTimeMillis());
		request.multiMessage = weiboMessage;

		// 3. 发送请求消息到微博，唤起微博分享界面
		if (mShareType == SHARE_CLIENT) {
			mWeiboShareAPI.sendRequest(WBShareActivity.this, request);
		} else if (mShareType == SHARE_ALL_IN_ONE) {
			AuthInfo authInfo = new AuthInfo(this, Constants.APP_KEY,
					Constants.REDIRECT_URL, Constants.SCOPE);
			Oauth2AccessToken accessToken = AccessTokenKeeper
					.readAccessToken(getApplicationContext());
			String token = "";
			if (accessToken != null) {
				token = accessToken.getToken();
			}
			mWeiboShareAPI.sendRequest(this, request, authInfo, token,
					new WeiboAuthListener() {

						@Override
						public void onWeiboException(WeiboException arg0) {
						}

						@Override
						public void onComplete(Bundle bundle) {
							// TODO Auto-generated method stub
							Oauth2AccessToken newToken = Oauth2AccessToken
									.parseAccessToken(bundle);
							AccessTokenKeeper.writeAccessToken(
									getApplicationContext(), newToken);
							Toast.makeText(
									getApplicationContext(),
									"onAuthorizeComplete token = "
											+ newToken.getToken(), Toast.LENGTH_LONG).show();
						}

						@Override
						public void onCancel() {
						}
					});
		}
	}

	/**
	 * 第三方应用发送请求消息到微博，唤起微博分享界面。 当{@link IWeiboShareAPI#getWeiboAppSupportAPI()}
	 * < 10351 时，只支持分享单条消息，即 文本、图片、网页、音乐、视频中的一种，不支持Voice消息。
	 * 
	 * @param hasText
	 *            分享的内容是否有文本
	 * @param hasImage
	 *            分享的内容是否有图片
	 * @param hasWebpage
	 *            分享的内容是否有网页
	 * @param hasMusic
	 *            分享的内容是否有音乐
	 * @param hasVideo
	 *            分享的内容是否有视频
	 */
	private void sendSingleMessage(boolean hasText, boolean hasImage,
			boolean hasWebpage, boolean hasMusic, boolean hasVideo) {

		// 1. 初始化微博的分享消息
		// 用户可以分享文本、图片、网页、音乐、视频中的一种
		WeiboMessage weiboMessage = new WeiboMessage();
		if (hasText) {
			weiboMessage.mediaObject = getTextObj();
		}
		if (hasImage) {
			weiboMessage.mediaObject = getImageObj();
		}
		if (hasWebpage) {
			weiboMessage.mediaObject = getWebpageObj();
		}
		if (hasMusic) {
			weiboMessage.mediaObject = getMusicObj();
		}
		if (hasVideo) {
			weiboMessage.mediaObject = getVideoObj();
		}
		/*
		 * if (hasVoice) { weiboMessage.mediaObject = getVoiceObj(); }
		 */

		// 2. 初始化从第三方到微博的消息请求
		SendMessageToWeiboRequest request = new SendMessageToWeiboRequest();
		// 用transaction唯一标识一个请求
		request.transaction = String.valueOf(System.currentTimeMillis());
		request.message = weiboMessage;

		// 3. 发送请求消息到微博，唤起微博分享界面
		mWeiboShareAPI.sendRequest(WBShareActivity.this, request);
	}

	/**
	 * 创建文本消息对象。
	 * 
	 * @return 文本消息对象。
	 */
	private TextObject getTextObj() {
		TextObject textObject = new TextObject();
		// 分享的文本内容
		textObject.text = "文本内容";
		return textObject;
	}

	/**
	 * 创建图片消息对象。
	 * 
	 * @return 图片消息对象。
	 */
	private ImageObject getImageObj() {
		ImageObject imageObject = new ImageObject();
		// 设置缩略图。 注意：最终压缩过的缩略图大小不得超过 32kb。
		Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
				R.drawable.lib_sdk_weibo_logo);
		imageObject.setImageObject(bitmap);
		return imageObject;
	}

	/**
	 * 创建多媒体（网页）消息对象。
	 * 
	 * @return 多媒体（网页）消息对象。
	 */
	private WebpageObject getWebpageObj() {
		WebpageObject mediaObject = new WebpageObject();
		mediaObject.identify = Utility.generateGUID();// 识别(不需要管)
		mediaObject.title = "标题";// 网页标题
		mediaObject.description = "描述";// 网页界面的描述,必不可少，不然无法分享。

		Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
				R.drawable.lib_sdk_weibo_logo);
		// 设置 Bitmap 类型的图片到视频对象里 设置缩略图。 注意：最终压缩过的缩略图大小不得超过 32kb。
		mediaObject.setThumbImage(bitmap);// 设置网页logo图标
		mediaObject.actionUrl = "http://admin.game-hot.tv";// 点击网页的URL链接
		mediaObject.defaultText = "Webpage 默认文案";// 可有可无。基本没看见什么作用。
		return mediaObject;
	}

	/**
	 * 创建多媒体（音乐）消息对象。
	 * 
	 * @return 多媒体（音乐）消息对象。
	 */
	private MusicObject getMusicObj() {
		// 创建媒体消息
		MusicObject musicObject = new MusicObject();
		musicObject.identify = Utility.generateGUID();// 识别(不需要管)
		musicObject.title = "标题";// 网页标题
		musicObject.description = "描述";// 网页界面的描述,必不可少，不然无法分享。

		Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
				R.drawable.lib_sdk_weibo_logo);
		// 设置 Bitmap 类型的图片到视频对象里 设置缩略图。 注意：最终压缩过的缩略图大小不得超过 32kb。
		musicObject.setThumbImage(bitmap);// 设置网页logo图标
		musicObject.actionUrl = "http://admin.game-hot.tv";// 点击网页的URL链接
		musicObject.dataUrl = "www.weibo.com";// 点击音乐播放时的数据来源。
		musicObject.dataHdUrl = "www.weibo.com";// 点击音乐播放时的数据高清来源
		musicObject.duration = 10;// 持续时间。不需要管。就这样默认设置。
		musicObject.defaultText = "Webpage 默认文案";// 可有可无。基本没看见什么作用。
		return musicObject;
	}

	/**
	 * 创建多媒体（视频）消息对象。
	 * 
	 * @return 多媒体（视频）消息对象。
	 */
	private VideoObject getVideoObj() {
		// 创建媒体消息
		VideoObject videoObject = new VideoObject();
		videoObject.identify = Utility.generateGUID();// 识别(不需要管)
		videoObject.title = "标题";// 网页标题
		videoObject.description = "描述";// 网页界面的描述,必不可少，不然无法分享。
		Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
				R.drawable.lib_sdk_weibo_logo);
		// 设置 Bitmap 类型的图片到视频对象里 设置缩略图。 注意：最终压缩过的缩略图大小不得超过 32kb。

		ByteArrayOutputStream os = null;
		try {
			os = new ByteArrayOutputStream();
			bitmap.compress(Bitmap.CompressFormat.JPEG, 85, os);
			System.out.println("kkkkkkk    size  " + os.toByteArray().length);
		} catch (Exception e) {
			e.printStackTrace();
			LogUtil.e("Weibo.BaseMediaObject", "put thumb failed");
		} finally {
			try {
				if (os != null) {
					os.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

		videoObject.setThumbImage(bitmap);// 设置网页logo图标
		videoObject.actionUrl = "http://admin.game-hot.tv";// 点击网页的URL链接
		videoObject.dataUrl = "www.weibo.com";// 点击音乐播放时的数据来源。
		videoObject.dataHdUrl = "www.weibo.com";// 点击音乐播放时的数据高清来源
		videoObject.duration = 10;// 持续时间。不需要管。就这样默认设置。
		videoObject.defaultText = "Webpage 默认文案";// 可有可无。基本没看见什么作用。
		return videoObject;
	}

	/**
	 * 创建多媒体（音频）消息对象。
	 * 
	 * @return 多媒体（音乐）消息对象。
	 */
	private VoiceObject getVoiceObj() {
		// 创建媒体消息
		VoiceObject voiceObject = new VoiceObject();
		voiceObject.identify = Utility.generateGUID();// 识别(不需要管)
		voiceObject.title = "标题";// 网页标题
		voiceObject.description = "描述";// 网页界面的描述,必不可少，不然无法分享。
		Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
				R.drawable.lib_sdk_weibo_logo);
		// 设置 Bitmap 类型的图片到视频对象里 设置缩略图。 注意：最终压缩过的缩略图大小不得超过 32kb。
		voiceObject.setThumbImage(bitmap);// 设置网页logo图标

		voiceObject.actionUrl = "http://admin.game-hot.tv";// 点击网页的URL链接
		voiceObject.dataUrl = "www.weibo.com";// 点击音乐播放时的数据来源。
		voiceObject.dataHdUrl = "www.weibo.com";// 点击音乐播放时的数据高清来源
		voiceObject.duration = 10;// 持续时间。不需要管。就这样默认设置。
		voiceObject.defaultText = "Webpage 默认文案";// 可有可无。基本没看见什么作用。
		return voiceObject;
	}

}
